{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "be64b830-7816-4b70-8365-0e06889720cf",
   "metadata": {},
   "source": [
    "## 数据的清洗和数据集的准备\n",
    "\n",
    "\n",
    "## 每天的记账\n",
    "\n",
    "理由  消费金额\n",
    "\n",
    "## 网购\n",
    "\n",
    "数据丢失\n",
    "\n",
    "\n",
    "## 天气预报\n",
    "\n",
    "日期  温度  天气状况  湿度  紫外系数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "424d3b95-3768-4fe0-a08a-ebf3396ea7bc",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "89484fb6-9068-4277-b888-61c25fe17a72",
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [],
   "source": [
    "import os\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a7a3c506-0917-4c94-8d62-3dc68335015c",
   "metadata": {},
   "source": [
    "## 如何用pandas清洗"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "9b4944ff-7d60-43ec-9011-dcb32c1b6941",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "4a6a6088-2675-4ed4-9819-db04bf8451ba",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame(np.arange(0,128,2).reshape(16,4),\n",
    "                  columns=['A', 'B', 'C', 'D'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "890e1fef-c579-49fd-8760-a6a22cd74848",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "      <td>12</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>16</td>\n",
       "      <td>18</td>\n",
       "      <td>20</td>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>24</td>\n",
       "      <td>26</td>\n",
       "      <td>28</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>32</td>\n",
       "      <td>34</td>\n",
       "      <td>36</td>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>40</td>\n",
       "      <td>42</td>\n",
       "      <td>44</td>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>48</td>\n",
       "      <td>50</td>\n",
       "      <td>52</td>\n",
       "      <td>54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>56</td>\n",
       "      <td>58</td>\n",
       "      <td>60</td>\n",
       "      <td>62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>64</td>\n",
       "      <td>66</td>\n",
       "      <td>68</td>\n",
       "      <td>70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>72</td>\n",
       "      <td>74</td>\n",
       "      <td>76</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>80</td>\n",
       "      <td>82</td>\n",
       "      <td>84</td>\n",
       "      <td>86</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>88</td>\n",
       "      <td>90</td>\n",
       "      <td>92</td>\n",
       "      <td>94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>96</td>\n",
       "      <td>98</td>\n",
       "      <td>100</td>\n",
       "      <td>102</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>104</td>\n",
       "      <td>106</td>\n",
       "      <td>108</td>\n",
       "      <td>110</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>112</td>\n",
       "      <td>114</td>\n",
       "      <td>116</td>\n",
       "      <td>118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>120</td>\n",
       "      <td>122</td>\n",
       "      <td>124</td>\n",
       "      <td>126</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      A    B    C    D\n",
       "0     0    2    4    6\n",
       "1     8   10   12   14\n",
       "2    16   18   20   22\n",
       "3    24   26   28   30\n",
       "4    32   34   36   38\n",
       "5    40   42   44   46\n",
       "6    48   50   52   54\n",
       "7    56   58   60   62\n",
       "8    64   66   68   70\n",
       "9    72   74   76   78\n",
       "10   80   82   84   86\n",
       "11   88   90   92   94\n",
       "12   96   98  100  102\n",
       "13  104  106  108  110\n",
       "14  112  114  116  118\n",
       "15  120  122  124  126"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "146c05d5-dc04-4017-88c6-89bdf1df93ca",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>16</td>\n",
       "      <td>18</td>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>24</td>\n",
       "      <td>26</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>32</td>\n",
       "      <td>34</td>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>40</td>\n",
       "      <td>42</td>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>48</td>\n",
       "      <td>50</td>\n",
       "      <td>54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>56</td>\n",
       "      <td>58</td>\n",
       "      <td>62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>64</td>\n",
       "      <td>66</td>\n",
       "      <td>70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>72</td>\n",
       "      <td>74</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>80</td>\n",
       "      <td>82</td>\n",
       "      <td>86</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>88</td>\n",
       "      <td>90</td>\n",
       "      <td>94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>96</td>\n",
       "      <td>98</td>\n",
       "      <td>102</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>104</td>\n",
       "      <td>106</td>\n",
       "      <td>110</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>112</td>\n",
       "      <td>114</td>\n",
       "      <td>118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>120</td>\n",
       "      <td>122</td>\n",
       "      <td>126</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      A    B    D\n",
       "0     0    2    6\n",
       "1     8   10   14\n",
       "2    16   18   22\n",
       "3    24   26   30\n",
       "4    32   34   38\n",
       "5    40   42   46\n",
       "6    48   50   54\n",
       "7    56   58   62\n",
       "8    64   66   70\n",
       "9    72   74   78\n",
       "10   80   82   86\n",
       "11   88   90   94\n",
       "12   96   98  102\n",
       "13  104  106  110\n",
       "14  112  114  118\n",
       "15  120  122  126"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.drop(['C'], axis=1)   #显示出删掉C的df，只是临时删的\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "56c314e2-4477-4818-a49b-17700fe6df91",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>16</td>\n",
       "      <td>18</td>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>24</td>\n",
       "      <td>26</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>32</td>\n",
       "      <td>34</td>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>40</td>\n",
       "      <td>42</td>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>48</td>\n",
       "      <td>50</td>\n",
       "      <td>54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>56</td>\n",
       "      <td>58</td>\n",
       "      <td>62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>64</td>\n",
       "      <td>66</td>\n",
       "      <td>70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>72</td>\n",
       "      <td>74</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>80</td>\n",
       "      <td>82</td>\n",
       "      <td>86</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>88</td>\n",
       "      <td>90</td>\n",
       "      <td>94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>96</td>\n",
       "      <td>98</td>\n",
       "      <td>102</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>104</td>\n",
       "      <td>106</td>\n",
       "      <td>110</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>112</td>\n",
       "      <td>114</td>\n",
       "      <td>118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>120</td>\n",
       "      <td>122</td>\n",
       "      <td>126</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      A    B    D\n",
       "0     0    2    6\n",
       "1     8   10   14\n",
       "2    16   18   22\n",
       "3    24   26   30\n",
       "4    32   34   38\n",
       "5    40   42   46\n",
       "6    48   50   54\n",
       "7    56   58   62\n",
       "8    64   66   70\n",
       "9    72   74   78\n",
       "10   80   82   86\n",
       "11   88   90   94\n",
       "12   96   98  102\n",
       "13  104  106  110\n",
       "14  112  114  118\n",
       "15  120  122  126"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.drop('C', axis=1, inplace=True)  #真正删掉C这一列\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "d4c4660a-0e9e-4787-91ae-8c120003c2fd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id1</th>\n",
       "      <th>id2</th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>a</td>\n",
       "      <td>a1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>a</td>\n",
       "      <td>a2</td>\n",
       "      <td>2</td>\n",
       "      <td>0.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>a</td>\n",
       "      <td>a2</td>\n",
       "      <td>3</td>\n",
       "      <td>0.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>b</td>\n",
       "      <td>b1</td>\n",
       "      <td>4</td>\n",
       "      <td>0.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>b</td>\n",
       "      <td>b2</td>\n",
       "      <td>5</td>\n",
       "      <td>0.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>b</td>\n",
       "      <td>b2</td>\n",
       "      <td>5</td>\n",
       "      <td>0.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  id1 id2  x    y\n",
       "0   a  a1  1  0.1\n",
       "1   a  a2  2  0.3\n",
       "2   a  a2  3  0.3\n",
       "3   b  b1  4  0.4\n",
       "4   b  b2  5  0.5\n",
       "5   b  b2  5  0.5"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame({\n",
    "    'id1': ['a', 'a', 'a', 'b', 'b', 'b'],\n",
    "    'id2': ['a1', 'a2', 'a2', 'b1', 'b2', 'b2'],\n",
    "    'x': [1, 2, 3, 4, 5, 5] ,\n",
    "    'y': [0.1, 0.3, 0.3, 0.4, 0.5, 0.5] ,\n",
    "})\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "cccfa315-e748-404b-a64d-2958cdee02c0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    False\n",
       "1    False\n",
       "2    False\n",
       "3    False\n",
       "4    False\n",
       "5     True\n",
       "dtype: bool"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.duplicated()  #找出重复的数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "89b6b2c5-aa4c-4140-b13c-7e41052ff9f8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id1</th>\n",
       "      <th>id2</th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>b</td>\n",
       "      <td>b2</td>\n",
       "      <td>5</td>\n",
       "      <td>0.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  id1 id2  x    y\n",
       "5   b  b2  5  0.5"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df.duplicated() ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "d781b895-6ecb-45ed-b9e3-b08540d6e983",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id1</th>\n",
       "      <th>id2</th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>a</td>\n",
       "      <td>a1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>a</td>\n",
       "      <td>a2</td>\n",
       "      <td>2</td>\n",
       "      <td>0.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>a</td>\n",
       "      <td>a2</td>\n",
       "      <td>3</td>\n",
       "      <td>0.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>b</td>\n",
       "      <td>b1</td>\n",
       "      <td>4</td>\n",
       "      <td>0.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>b</td>\n",
       "      <td>b2</td>\n",
       "      <td>5</td>\n",
       "      <td>0.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  id1 id2  x    y\n",
       "0   a  a1  1  0.1\n",
       "1   a  a2  2  0.3\n",
       "2   a  a2  3  0.3\n",
       "3   b  b1  4  0.4\n",
       "4   b  b2  5  0.5"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()    #查看一部分数据"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1fb27919-5dff-4554-80d8-ea06ef225220",
   "metadata": {},
   "source": [
    "## 缺失数据\n",
    "\n",
    "\n",
    " isnull()与notnull()\r\n",
    "使用这两个方法判断数据中是否存在缺失\n",
    "\n",
    "dropna()可以删掉缺失值：df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)\n",
    "\n",
    "pandas提供了fillna()方法，用来补全缺失值，而非简单过滤。其调用语法为：\r\n",
    "\r\n",
    "df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)\r",
    "：\n",
    "值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "0c07d6b0-43c5-4682-86c7-5c2b61bb5dd7",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame({\n",
    "    'id': ['a', 'a', 'c', 'b', 'b', 'b'],\n",
    "    'date': ['2018-01-01', '2018-10-01', '2018-09-01', '', '2018-10-01', '2018-10-01'],\n",
    "    'value': [1, 2, 3, np.nan, 5, 5] ,\n",
    "})\n",
    "\n",
    "df['date'] = pd.to_datetime(df['date'])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "10bb3443-5555-45d8-8013-1d6ab0082b55",
   "metadata": {},
   "source": [
    "## 处理错误数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "37acae39-f1c9-4b31-a0c3-54a28d39636d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>date</th>\n",
       "      <th>value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>5</td>\n",
       "      <td>5.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>2018-08-01 09:36:00</td>\n",
       "      <td>3.200000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>2018-01-01 00:00:00</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>2018-09-01 00:00:00</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>2018-10-01 00:00:00</td>\n",
       "      <td>3.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>2018-10-01 00:00:00</td>\n",
       "      <td>5.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>2018-10-01 00:00:00</td>\n",
       "      <td>5.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>NaN</td>\n",
       "      <td>1.788854</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                      date     value\n",
       "count                    5  5.000000\n",
       "mean   2018-08-01 09:36:00  3.200000\n",
       "min    2018-01-01 00:00:00  1.000000\n",
       "25%    2018-09-01 00:00:00  2.000000\n",
       "50%    2018-10-01 00:00:00  3.000000\n",
       "75%    2018-10-01 00:00:00  5.000000\n",
       "max    2018-10-01 00:00:00  5.000000\n",
       "std                    NaN  1.788854"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "b891533b-fa18-487c-bcd6-e24b063c1647",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<>:1: SyntaxWarning: invalid escape sequence '\\s'\n",
      "<>:1: SyntaxWarning: invalid escape sequence '\\s'\n",
      "C:\\Users\\sw\\AppData\\Local\\Temp\\ipykernel_17724\\3265510934.py:1: SyntaxWarning: invalid escape sequence '\\s'\n",
      "  df1 = pd.read_table('astro-pandas-tutorials-master/Sample_data/rcs0327_knotU_N3_nirspeckeck.txt', sep='\\s+', comment=\"#\")\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>wave</th>\n",
       "      <th>flam</th>\n",
       "      <th>noise</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>11436.9</td>\n",
       "      <td>-1.795000e-17</td>\n",
       "      <td>5.534000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>11439.2</td>\n",
       "      <td>1.203000e-16</td>\n",
       "      <td>4.374000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>11441.4</td>\n",
       "      <td>1.857000e-17</td>\n",
       "      <td>4.261000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>11443.7</td>\n",
       "      <td>-1.751000e-16</td>\n",
       "      <td>3.584000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>11446.0</td>\n",
       "      <td>-8.348000e-17</td>\n",
       "      <td>3.160000e-17</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      wave          flam         noise\n",
       "0  11436.9 -1.795000e-17  5.534000e-17\n",
       "1  11439.2  1.203000e-16  4.374000e-17\n",
       "2  11441.4  1.857000e-17  4.261000e-17\n",
       "3  11443.7 -1.751000e-16  3.584000e-17\n",
       "4  11446.0 -8.348000e-17  3.160000e-17"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1 = pd.read_table('astro-pandas-tutorials-master/Sample_data/rcs0327_knotU_N3_nirspeckeck.txt', sep='\\s+', comment=\"#\")\n",
    "df1.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cf539ff3-1a3b-4b8d-8fe9-53ee1a0ea17f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4edc9cfb-adf7-45cb-a0c7-92d4ae66a131",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "32259392-e64e-47c2-a8fe-6e7d251eeb63",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<bound method DataFrame.info of          wave          flam         noise\n",
       "0     11436.9 -1.795000e-17  5.534000e-17\n",
       "1     11439.2  1.203000e-16  4.374000e-17\n",
       "2     11441.4  1.857000e-17  4.261000e-17\n",
       "3     11443.7 -1.751000e-16  3.584000e-17\n",
       "4     11446.0 -8.348000e-17  3.160000e-17\n",
       "...       ...           ...           ...\n",
       "1116  14298.8           NaN  0.000000e+00\n",
       "1117  14301.6           NaN  0.000000e+00\n",
       "1118  14304.5           NaN  0.000000e+00\n",
       "1119  14307.4           NaN  0.000000e+00\n",
       "1120  14310.2           NaN  0.000000e+00\n",
       "\n",
       "[1121 rows x 3 columns]>"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.info"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "f13fe851-6ac2-4cc6-9d4f-774ef6c09431",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>wave</th>\n",
       "      <th>flam</th>\n",
       "      <th>noise</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>1121.000000</td>\n",
       "      <td>1.107000e+03</td>\n",
       "      <td>1.121000e+03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>12819.974844</td>\n",
       "      <td>1.633409e-17</td>\n",
       "      <td>2.663281e-16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>830.235363</td>\n",
       "      <td>4.336269e-16</td>\n",
       "      <td>2.096674e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>11436.900000</td>\n",
       "      <td>-1.031000e-14</td>\n",
       "      <td>0.000000e+00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>12096.000000</td>\n",
       "      <td>-5.886500e-19</td>\n",
       "      <td>3.083000e-18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>12793.100000</td>\n",
       "      <td>3.920000e-18</td>\n",
       "      <td>5.154000e-18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>13530.400000</td>\n",
       "      <td>1.009500e-17</td>\n",
       "      <td>1.115000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>14310.200000</td>\n",
       "      <td>4.415000e-15</td>\n",
       "      <td>5.516000e-14</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               wave          flam         noise\n",
       "count   1121.000000  1.107000e+03  1.121000e+03\n",
       "mean   12819.974844  1.633409e-17  2.663281e-16\n",
       "std      830.235363  4.336269e-16  2.096674e-15\n",
       "min    11436.900000 -1.031000e-14  0.000000e+00\n",
       "25%    12096.000000 -5.886500e-19  3.083000e-18\n",
       "50%    12793.100000  3.920000e-18  5.154000e-18\n",
       "75%    13530.400000  1.009500e-17  1.115000e-17\n",
       "max    14310.200000  4.415000e-15  5.516000e-14"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "8815deb0-7d48-45a2-92be-2353e1e45d5f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<bound method DataFrame.sum of        wave   flam  noise\n",
       "0     False  False  False\n",
       "1     False  False  False\n",
       "2     False  False  False\n",
       "3     False  False  False\n",
       "4     False  False  False\n",
       "...     ...    ...    ...\n",
       "1116  False   True  False\n",
       "1117  False   True  False\n",
       "1118  False   True  False\n",
       "1119  False   True  False\n",
       "1120  False   True  False\n",
       "\n",
       "[1121 rows x 3 columns]>"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.isnull().sum"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "6ad2c001-2222-4e10-8995-be69b60e2e56",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>wave</th>\n",
       "      <th>flam</th>\n",
       "      <th>noise</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1107</th>\n",
       "      <td>14273.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1108</th>\n",
       "      <td>14275.9</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1109</th>\n",
       "      <td>14278.8</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1110</th>\n",
       "      <td>14281.6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1111</th>\n",
       "      <td>14284.5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1112</th>\n",
       "      <td>14287.3</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1113</th>\n",
       "      <td>14290.2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1114</th>\n",
       "      <td>14293.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1115</th>\n",
       "      <td>14295.9</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1116</th>\n",
       "      <td>14298.8</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1117</th>\n",
       "      <td>14301.6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1118</th>\n",
       "      <td>14304.5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1119</th>\n",
       "      <td>14307.4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1120</th>\n",
       "      <td>14310.2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         wave  flam  noise\n",
       "1107  14273.1   NaN    0.0\n",
       "1108  14275.9   NaN    0.0\n",
       "1109  14278.8   NaN    0.0\n",
       "1110  14281.6   NaN    0.0\n",
       "1111  14284.5   NaN    0.0\n",
       "1112  14287.3   NaN    0.0\n",
       "1113  14290.2   NaN    0.0\n",
       "1114  14293.1   NaN    0.0\n",
       "1115  14295.9   NaN    0.0\n",
       "1116  14298.8   NaN    0.0\n",
       "1117  14301.6   NaN    0.0\n",
       "1118  14304.5   NaN    0.0\n",
       "1119  14307.4   NaN    0.0\n",
       "1120  14310.2   NaN    0.0"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.loc[df1['flam'].isnull()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a0b88229-87e7-413b-9609-78c5dc2b5f58",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5b4cd25e-b351-4713-b820-15b871b48787",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import scipy as sp\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import sklearn\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8089ba6f-c845-4c61-94b8-68f613ba903e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 构建模型\n",
    "regr = LinearRegression()\n",
    "regr.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "78b80ec3-d529-49ec-9cf8-56a76404455b",
   "metadata": {},
   "outputs": [],
   "source": [
    "regr.coef_, regr.intercept_  #  给出系数和截距"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b2ba9f33-f0b9-491f-8cc2-4e13e112ba8e",
   "metadata": {},
   "source": [
    "## 作业"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "06d9337a-4115-4f5e-b03f-438d3206174e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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5865tnfu3JkVK1bkaZ+enk5ycnKuHxEREam4Sjx8HDx4ELfbTVhYWK7tYWFhJCQk5Gk/atQonE5nzk9kZGRJlyQiIiLlSKkNOLWs3AM6jTF5tgE888wzJCUl5fzs3r27tEoSERGRcqDE5/moVasWdrs9Ty9HYmJint4QAIfDgcPhKOkyREREpJwq8Z6PgIAAWrRowaJFi3JtX7RoEe3atSvpXyciIiI+plRmOB0yZAh9+vShZcuWtG3blgkTJrBr1y4efvjh0vh1IiIi4kNKJXzcddddHDp0iBdffJH4+Hiio6P59ttvqVevXmn8OhEREfEhlWZ6dRERESk95WJ6dREREZH8KHyIiIhImSqVMR/n4uRTIM10KiIi4jtOfm8XZjRHuQsfKSkpAJrpVERExAelpKTgdDoLbFPuBpx6PB727dtHcHBwvjOinovk5GQiIyPZvXt3hR/MWpmuFSrX9epaK67KdL261orHGENKSgoRERHYbAWP6ih3PR82m406deqU6u8ICQmp0H8ATlWZrhUq1/XqWiuuynS9utaK5Ww9HidpwKmIiIiUKYUPERERKVOVKnw4HA6GDRtWKRayq0zXCpXrenWtFVdlul5da+VW7gacioiISMVWqXo+RERExPsUPkRERKRMKXyIiIhImVL4EBERkTJV4cLHu+++S/369QkMDKRFixYsX768wPZLly6lRYsWBAYGcuGFF/Lee++VUaXFN2rUKK644gqCg4MJDQ2le/fubNu2rcBjlixZgmVZeX5+//33Mqq6+IYPH56nbpfLVeAxvnhfAS644IJ879OAAQPybe9L93XZsmV07dqViIgILMviyy+/zLXfGMPw4cOJiIggKCiIjh07snnz5rOed9asWURFReFwOIiKimLOnDmldAVFU9D1ZmZm8tRTT3HppZdStWpVIiIiuPfee9m3b1+B55w0aVK+9zstLa2Ur6ZgZ7u3/fr1y1NzmzZtznre8nhvz3at+d0fy7J49dVXz3jO8npfS1OFCh8zZ85k8ODBPPfcc8TGxnL11VfTpUsXdu3alW/7uLg4brzxRq6++mpiY2N59tlnefTRR5k1a1YZV140S5cuZcCAAaxcuZJFixaRlZVF586dSU1NPeux27ZtIz4+PuenYcOGZVDxuWvSpEmuujdu3HjGtr56XwFWr16d6zoXLVoEwB133FHgcb5wX1NTU7nssssYN25cvvtfeeUVXn/9dcaNG8fq1atxuVx06tQpZ72n/Pzyyy/cdddd9OnTh99++40+ffpw55138uuvv5bWZRRaQdd7/Phx1q1bxwsvvMC6deuYPXs2f/zxB7fccstZzxsSEpLrXsfHxxMYGFgal1BoZ7u3ADExMblq/vbbbws8Z3m9t2e71tPvzccff4xlWdx2220Fnrc83tdSZSqQVq1amYcffjjXtsaNG5unn3463/ZDhw41jRs3zrXtoYceMm3atCm1GktDYmKiAczSpUvP2ObHH380gDly5EjZFVZChg0bZi677LJCt68o99UYYx577DHToEED4/F48t3vq/cVMHPmzMn57PF4jMvlMqNHj87ZlpaWZpxOp3nvvffOeJ4777zTxMTE5Np2ww03mLvvvrvEaz4Xp19vflatWmUAs3PnzjO2mThxonE6nSVbXAnL71r79u1runXrVqTz+MK9Lcx97datm7n22msLbOML97WkVZiej4yMDNauXUvnzp1zbe/cuTMrVqzI95hffvklT/sbbriBNWvWkJmZWWq1lrSkpCQAatSocda2zZo1Izw8nOuuu44ff/yxtEsrMdu3byciIoL69etz991389dff52xbUW5rxkZGUydOpX777//rIss+up9PSkuLo6EhIRc983hcNChQ4cz/v2FM9/rgo4pr5KSkrAsi+rVqxfY7tixY9SrV486depw8803ExsbWzYFnqMlS5YQGhrKxRdfzD/+8Q8SExMLbF8R7u3+/fuZN28eDzzwwFnb+up9La4KEz4OHjyI2+0mLCws1/awsDASEhLyPSYhISHf9llZWRw8eLDUai1JxhiGDBnCVVddRXR09BnbhYeHM2HCBGbNmsXs2bNp1KgR1113HcuWLSvDaoundevWTJkyhQULFvDBBx+QkJBAu3btOHToUL7tK8J9Bfjyyy85evQo/fr1O2MbX76vpzr5d7Qof39PHlfUY8qjtLQ0nn76aXr16lXgwmONGzdm0qRJfP3110yfPp3AwECuvPJKtm/fXobVFl2XLl349NNP+eGHH/jvf//L6tWrufbaa0lPTz/jMRXh3k6ePJng4GB69OhRYDtfva/notytanuuTv8XojGmwH815tc+v+3l1cCBA9mwYQM//fRTge0aNWpEo0aNcj63bduW3bt389prr9G+ffvSLvOcdOnSJed/X3rppbRt25YGDRowefJkhgwZku8xvn5fAT766CO6dOlCRETEGdv48n3NT1H//hb3mPIkMzOTu+++G4/Hw7vvvltg2zZt2uQaqHnllVfSvHlzxo4dy9tvv13apRbbXXfdlfO/o6OjadmyJfXq1WPevHkFfjH7+r39+OOPueeee846dsNX7+u5qDA9H7Vq1cJut+dJxYmJiXnS80kulyvf9n5+ftSsWbPUai0pgwYN4uuvv+bHH3+kTp06RT6+TZs2Ppmsq1atyqWXXnrG2n39vgLs3LmTxYsX8+CDDxb5WF+8ryffXirK39+TxxX1mPIkMzOTO++8k7i4OBYtWlTk5dZtNhtXXHGFz93v8PBw6tWrV2Ddvn5vly9fzrZt24r1d9hX72tRVJjwERAQQIsWLXLeDjhp0aJFtGvXLt9j2rZtm6f9woULadmyJf7+/qVW67kyxjBw4EBmz57NDz/8QP369Yt1ntjYWMLDw0u4utKXnp7O1q1bz1i7r97XU02cOJHQ0FBuuummIh/ri/e1fv36uFyuXPctIyODpUuXnvHvL5z5Xhd0THlxMnhs376dxYsXFysYG2NYv369z93vQ4cOsXv37gLr9uV7C9k9ly1atOCyyy4r8rG+el+LxFsjXUvDjBkzjL+/v/noo4/Mli1bzODBg03VqlXN33//bYwx5umnnzZ9+vTJaf/XX3+ZKlWqmMcff9xs2bLFfPTRR8bf39988cUX3rqEQunfv79xOp1myZIlJj4+Pufn+PHjOW1Ov9Y33njDzJkzx/zxxx9m06ZN5umnnzaAmTVrljcuoUieeOIJs2TJEvPXX3+ZlStXmptvvtkEBwdXuPt6ktvtNnXr1jVPPfVUnn2+fF9TUlJMbGysiY2NNYB5/fXXTWxsbM7bHaNHjzZOp9PMnj3bbNy40fTs2dOEh4eb5OTknHP06dMn19trP//8s7Hb7Wb06NFm69atZvTo0cbPz8+sXLmyzK/vdAVdb2ZmprnllltMnTp1zPr163P9PU5PT885x+nXO3z4cDN//nzz559/mtjYWHPfffcZPz8/8+uvv3rjEnMUdK0pKSnmiSeeMCtWrDBxcXHmxx9/NG3btjXnn3++T97bs/05NsaYpKQkU6VKFTN+/Ph8z+Er97U0VajwYYwx77zzjqlXr54JCAgwzZs3z/X6ad++fU2HDh1ytV+yZIlp1qyZCQgIMBdccMEZ/7CUJ0C+PxMnTsxpc/q1jhkzxjRo0MAEBgaa8847z1x11VVm3rx5ZV98Mdx1110mPDzc+Pv7m4iICNOjRw+zefPmnP0V5b6etGDBAgOYbdu25dnny/f15GvBp//07dvXGJP9uu2wYcOMy+UyDofDtG/f3mzcuDHXOTp06JDT/qTPP//cNGrUyPj7+5vGjRuXm+BV0PXGxcWd8e/xjz/+mHOO06938ODBpm7duiYgIMDUrl3bdO7c2axYsaLsL+40BV3r8ePHTefOnU3t2rWNv7+/qVu3runbt6/ZtWtXrnP4yr09259jY4x5//33TVBQkDl69Gi+5/CV+1qaLGP+fySeiIiISBmoMGM+RERExDcofIiIiEiZUvgQERGRMqXwISIiImVK4UNERETKlMKHiIiIlCmFDxERESlTCh8iIiJSphQ+REREpEwpfIiIiEiZUvgQERGRMqXwISIiImXq/wB9pHXdeAFiLwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitted slope (A): 2.024860945251521\n",
      "Fitted intercept (B): 0.7233264058387865\n"
     ]
    }
   ],
   "source": [
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "                             \n",
    "\n",
    "A = 2  # 斜率                                                      #Y =AX + B,定义A和B的值\n",
    "B = 1  # 截距\n",
    "X = np.arange(0, 20)                                              # 从0到19生成X的值\n",
    "Y = A * X + B                                                     # 计算Y的值\n",
    "\n",
    "                                                                  #画出图像，横坐标为x，纵坐标为y。\n",
    "#plt.plot(x，y，label=‘线条的名字’)  .format(a,b)可以帮我们把AB的值插入字符串中间\n",
    "plt.plot(X, Y, label='Line: Y = {}X + {}'.format(A, B))      \n",
    "\n",
    "# 添加噪声\n",
    "\n",
    "#np.random.normal(均值，标准差，生成个数），利用X.shape保证噪声的个数和x的个数是一样的。\n",
    "noise = np.random.normal(0, 1, X.shape)                           # 假设噪声均值为0，标准差为1\n",
    "Y_noisy = Y + noise                                               #让噪声上下浮动影响变量的值\n",
    "\n",
    "# 拟合加噪声之后的直线,利用np.polyfit(自变量，因变量，方程的阶数）可以直接帮我算出含有噪声的方程的斜率和截距\n",
    "fuc = np.polyfit(X, Y_noisy, 1)                                   #拟合一个直线方程，然后算出A和B，然后放在一个列表里                                          \n",
    "\n",
    "A_noisy = fuc[0]                                                  # 斜率是第一个数\n",
    "B_noisy = fuc[1]                                                  # 截距是第二个数\n",
    "\n",
    "                                                                  # 画出加噪声之后的直线\n",
    "plt.plot(X, A_noisy * X + B_noisy, label=' noisy Line: Y = {}X + {}'.format(A_noisy, B_noisy))\n",
    "\n",
    "\n",
    "plt.scatter(X, Y_noisy, label='Noisy')                            #利用plt.scatter可以画出带噪声的点\n",
    "\n",
    "\n",
    "plt.legend()                                                      # 添加图例，让label显示出来\n",
    "\n",
    "                                                                  \n",
    "plt.show()                                                        # 显示图表\n",
    "\n",
    "\n",
    "print(\"slope (A):\", A_noisy)                                      # 打印拟合后的斜率和截距\n",
    "print(\"intercept (B):\", B_noisy)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "9608d4db-773d-4f9e-a3b2-5c81844879af",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2.03943371 0.74994351]\n"
     ]
    }
   ],
   "source": [
    "print(fuc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "bc4e0b1d-dbbd-4db3-89cb-25c1a2a91f8d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2. 1.]\n"
     ]
    }
   ],
   "source": [
    "f = np.polyfit(X, Y, 1)\n",
    "print(f)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7470d60b-0175-476c-a6b3-7b581ac47395",
   "metadata": {},
   "source": [
    "## 如果让噪声变大\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "9b986646-003a-4d95-a4dc-da99399aaec5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "slope (A): 1.914196539013413\n",
      "intercept (B): 1.5241087480709137\n"
     ]
    }
   ],
   "source": [
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "                             \n",
    "\n",
    "A = 2  # 斜率                                                      #Y =AX + B,定义A和B的值\n",
    "B = 1  # 截距\n",
    "X = np.arange(0, 20)                                              # 从0到19生成X的值\n",
    "Y = A * X + B                                                     # 计算Y的值\n",
    "\n",
    "                                                                  #画出图像，横坐标为x，纵坐标为y。\n",
    "#plt.plot(x，y，label=‘线条的名字’)  .format(a,b)可以帮我们把AB的值插入字符串中间\n",
    "plt.plot(X, Y, label='Line: Y = {}X + {}'.format(A, B))      \n",
    "\n",
    "# 添加噪声\n",
    "\n",
    "#np.random.normal(均值，标准差，生成个数），利用X.shape保证噪声的个数和x的个数是一样的。\n",
    "noise = np.random.normal(0, 5, X.shape)                           # 假设噪声均值为0，标准差为1\n",
    "Y_noisy = Y + noise                                               #让噪声上下浮动影响变量的值\n",
    "\n",
    "# 拟合加噪声之后的直线,利用np.polyfit(自变量，因变量，方程的阶数）可以直接帮我算出含有噪声的方程的斜率和截距\n",
    "fuc = np.polyfit(X, Y_noisy, 1)                                   #拟合一个直线方程，然后算出A和B，然后放在一个列表里                                          \n",
    "\n",
    "A_noisy = fuc[0]                                                  # 斜率是第一个数\n",
    "B_noisy = fuc[1]                                                  # 截距是第二个数\n",
    "\n",
    "                                                                  # 画出加噪声之后的直线\n",
    "plt.plot(X, A_noisy * X + B_noisy, label=' noisy Line: Y = {}X + {}'.format(A_noisy, B_noisy))\n",
    "\n",
    "\n",
    "plt.scatter(X, Y_noisy, label='Noisy')                            #利用plt.scatter可以画出带噪声的点\n",
    "\n",
    "\n",
    "plt.legend()                                                      # 添加图例，让label显示出来\n",
    "\n",
    "                                                                  \n",
    "plt.show()                                                        # 显示图表\n",
    "\n",
    "\n",
    "print(\"slope (A):\", A_noisy)                                      # 打印拟合后的斜率和截距\n",
    "print(\"intercept (B):\", B_noisy)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5d7e8a1f-b883-469f-bb86-873ff47f85bd",
   "metadata": {},
   "source": [
    "## 总结\n",
    "如果噪声变大，直线的偏差也会更大"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b43e6661-1b49-44d5-a381-43d600427ea9",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
